﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;


namespace App.Modelo.Tablero
{
    public enum EnumTipoIndicador
    {
        Gerencial,
        Operativo
    }

    public enum EstadoObjetivo
    {
        SinDatos,
        Rojo,
        Amarillo,
        Verde
    }


    public enum EnumTipoMedida {
        Ratio,
        Cuenta
    }
    public enum EnumRelacionObjetivo
    {
        Positivo,
        Negativo
    }

    public class Indicador
    {
        public virtual Int64 Id { get; set; }
        public virtual string Descripcion { get; set; }
        public virtual bool Estado { get; set; }
        public virtual string CalculoNumerador { get; set; }
        public virtual string CalculoDenominador { get; set; }
        
        public virtual string DrillDown { get; set; }
        public virtual EnumTipoIndicador Tipo { get; set; }
        public virtual EnumRelacionObjetivo RelacionObjetivo { get; set; }
        public virtual EnumTipoMedida TipoMedida { get; set; }
        decimal _Minimo;
        decimal _Maximo;

        public virtual decimal Minimo
        {
            get
            {
                return TipoMedida == EnumTipoMedida.Cuenta ? _Minimo : 0;
            }
            set { _Minimo = value; }
        }
        public virtual decimal Maximo
        {
            get { return TipoMedida == EnumTipoMedida.Cuenta ? _Maximo : 1; }
            set { _Maximo = value; }
        }

        public virtual IList<Objetivo> Objetivos { get; set; }

        public virtual Objetivo GetObjetivo(int año, int mes)
        {
            var objetivo = (from o in Objetivos
                            where o.Mes == mes && o.Año == año
                            select o).FirstOrDefault();

            if (null == objetivo)
                objetivo = new Objetivo { Año = año, Mes = mes };

            return objetivo;
        }

        public virtual Objetivo GetObjetivo(int mes)
        {
            return GetObjetivo(DateTime.Now.Year, mes);
        }

        public virtual Objetivo GetObjetivo()
        {
            return GetObjetivo(DateTime.Now.Year, DateTime.Now.Month);
        }

        public virtual Objetivo GetObjetivo(DateTime date)
        {
            return GetObjetivo(date.Year, date.Month);
        }
    }

    public class Objetivo
    {
        public virtual int Año { get; set; }
        public virtual int Mes { get; set; }

        protected virtual Indicador Indicador { get; set; }
        public virtual decimal Minimo { get; set; }

        public virtual decimal Maximo { get; set; }

        public virtual string DisplayName()
        {
            return new DateTime(Año, Mes, 1).ToString("MMMM yyyy");
        }

        public virtual decimal? Valor { get; set; }
        public virtual DateTime? FechaLectura { get; set; }

        public virtual EstadoObjetivo GetEstado()
        {
            if (!Valor.HasValue)
                return EstadoObjetivo.SinDatos;

            var val = Valor;
            if (Indicador.RelacionObjetivo == EnumRelacionObjetivo.Positivo)
            {
                if (val < Minimo)
                    return EstadoObjetivo.Rojo;
                else if (val >= Minimo && val < Maximo)
                    return EstadoObjetivo.Amarillo;
                else
                    return EstadoObjetivo.Verde;
            }
            else
            {
                if (val < Minimo)
                    return EstadoObjetivo.Verde;
                else if (val >= Minimo && val < Maximo)
                    return EstadoObjetivo.Amarillo;
                else
                    return EstadoObjetivo.Rojo;
            }
        }
    }


}   
